package com.vadmin.vadminjava.servlet;

import com.vadmin.vadminjava.common.HttpUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
/* ***********************************************************
 *
 * 这个文件 特么有什么用？
 *
 * **********************************************************/
@RestController
@RequestMapping("/WxGongZhongHaoOpenId")
public class WxGongZhongHaoOpenId {

    private String appid = "wx35839eba72c12a73";
    private String secret = "e2ce8a211b4c14e75ae839ac5b9f7f9f";
    private String REDIRECT_URI = "http://www.qzzhuoen.com//WxGongZhongHaoOpenId/weixinLogin";//要跳转来的地址


    org.slf4j.Logger logger = LoggerFactory.getLogger(WxGongZhongHaoOpenId.class.getName());

    /**
     * 微信登录，这个直接访问，显示获取到的openId
     * 也可以用前端处理，替代这个方法
     */
    @RequestMapping(value = "/weixinLogin")
    public String weixinLogin(String code, String redirectUrl, HttpServletResponse response) throws IOException {
        String openId = "";
        String accessToken = "";
        String[] arrayData = new String[2];

        //获取code
        if (code == null) {

            String getCodeUrl = getCodeUrl(REDIRECT_URI);//带进去，拼接得到要跳转的获取code的微信地址
            logger.info("code不存在,即将跳转获取:{} ", getCodeUrl);
            response.sendRedirect(getCodeUrl);//跳转到上面拼接的地址，再跳回时，url中会得到一个code参数
            //code = getCodeUrl(redirect_uri); //这句他妈干嘛的？
        }else{
            arrayData = getOpenId(code);//根据code取到用户信息
            openId = arrayData[0];
            accessToken = arrayData[1];
            
        }

        logger.info("得到的数据：{}", arrayData);
        return openId;
    }

    // t得到获取code的url，用于前端跳转
    @RequestMapping(value="/getWXloginCodeUrl")
    public String getWXloginCodeUrl(String redirectUrl) throws IOException {
        String _url = getCodeUrl(redirectUrl);//带进去，拼接得到要跳转的获取code的微信地址
        return _url;
    }

    //根据code得到openId
    @RequestMapping(value="/getOpenIdByCode")
    public String getOpenIdByCode(String code) throws IOException {

        //初始
        JSONObject map = new JSONObject();
        map.put("resultFlag",false);
        map.put("resultMsg","获取获取openId失败");
        map.put("data","");

        //获取openid
        String[] arrayData = getOpenId(code);
        String openId = arrayData[0];
        if(StringUtils.isNoneEmpty(openId)){
            map.put("resultFlag",true);
            map.put("resultMsg","获取openId成功");
            map.put("data",openId);
        }

        logger.info("进行了微信公众号登录，返回给前端的数据：{}",map.toString());
        return map.toString();
    }

    //////////////////////////////////////////////////////下面是纯方法///////////////////////////////////////////////////
    //////////////////////////////////////////////////////下面是纯方法///////////////////////////////////////////////////
    //////////////////////////////////////////////////////下面是纯方法///////////////////////////////////////////////////
    /**
     * 使用get请求获取用户授权 得到openId,accessToken
     * @param code
     * @return
     */
    public String[] getOpenId(String code) {
        String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code";
        tokenUrl = tokenUrl + "&appid=" + appid + "&secret=" + secret + "&code=" + code;
        JSONObject json = null;
        try {
            json = new JSONObject(HttpUtils.doGet(tokenUrl));

        } catch (JSONException e2) {
            e2.printStackTrace();
        }
        String openId = "";
        String accessToken = "";
        String[] s = new String[2];
        if (json != null) {
            try {
                openId = json.getString("openid");
                accessToken = json.getString("access_token");
                s[0] = openId;
                s[1] = accessToken;
            } catch (JSONException e) {
                String errcode = null;
                try {
                    logger.warn("errcode================>手机登录 获取用户授权失败{},{}", code, json);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return s;
    }

    /**
     * 获取用户信息 拉取用户信息(需scope为 snsapi_userinfo)
     * 只有在用户将公众号绑定到微信开放平台帐号后，可以获取unionid
     */
    public String[] getUserInfo(String openid, String accessToken) {
        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN";
        userInfoUrl = userInfoUrl + "&access_token=" + accessToken + "&openid=" + openid;
        JSONObject json = null;
        try {
            json = new JSONObject(HttpUtils.doGet(userInfoUrl));
        } catch (JSONException e2) {
            e2.printStackTrace();
        }
        String nickname = ""; //用户昵称
        String sex = "";  //用户的性别
        String province = ""; //用户个人资料填写的省份
        String city = "";  //普通用户个人资料填写的城市
        String country = ""; //国家，如中国为CN
        String headimgurl = ""; //用户头像，
        String unionid = ""; //
        String[] s = new String[6];
        if (json != null) {
            try {
                nickname = json.getString("nickname");
                sex = json.getString("sex");
                province = json.getString("province");
                city = json.getString("city");
                country = json.getString("country");
                headimgurl = json.getString("headimgurl");
                s[0] = nickname;
                s[1] = sex;
                s[2] = province;
                s[3] = city;
                s[4] = country;
                s[5] = headimgurl;
            } catch (JSONException e) {
                String errcode = null;
                try {
                    errcode = json.getString("errcode");
                    System.out.println("errcode================>获取用户信息失败" + errcode);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return s;
    }

    // 获取code请求地址，这个回调地址需要在微信公众号后台也进行配置 不然会显示"redirect_uri域名还是与后台配置不一致"
    public String getCodeUrl(String redirect_uri) {
        redirect_uri = URLEncoder.encode(redirect_uri);   //使用 urlEncode 对链接进行处理
        String codeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize";
        codeUrl = codeUrl + "?appid=" + appid + "&redirect_uri=" + redirect_uri
                + "&response_type=code&scope=snsapi_userinfo&state=jetcms#wechat_redirect";
        return codeUrl;
    }

}